﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Septagon.TwochConnecter.Data.Threads;
using System.Text.RegularExpressions;

namespace Septagon.TwochConnecter.Data.Responses
{
	/// <summary>
	/// スレッドのDatファイルの生データを<see cref="Res"/>や<see cref="ResCollection"/>に変換します。
	/// </summary>
	public class DatConverter
	{
		/// <summary>
		/// <see cref="Res"/>を変換する際に<see cref="Func{string,Res}"/>を用いる<see cref="DatConverter"/>クラスの新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="func">変換に用いる<see cref="Func{string, Res}"/></param>
		/// <param name="th">変換元のスレッドを表す<see cref="Thread"/></param>
		/// <param name="dat">変換するdatの<see cref="string"/></param>
		public DatConverter(Func<string, Res> func, Thread th, string dat)
		{
			this.isFunc = true;
			this.ConvertFunction = func;
			this.BaseConvertThread = th;
			this.DatData = dat;
		}

		/// <summary>
		/// <see cref="Res"/>を変換する際に<see cref="Regex"/>を用いる<see cref="DatConverter"/>クラスの新しいインスタンスを初期化します。
		/// </summary>
		/// <param name="re">変換に用いる<see cref="Regex"/></param>
		/// <param name="th">変換元のスレッドを表す<see cref="Thread"/></param>
		/// <param name="dat">変換するdatの<see cref="string"/></param>
		public DatConverter(Regex re, Thread th, string dat)
		{
			this.ConvertRegex = re;
			this.BaseConvertThread = th;
			this.isFunc = false;
		}

		private bool isFunc;

		public string DatData { get; set; }

		public Func<string, Res> ConvertFunction { get; set; }

		public Regex ConvertRegex { get; set; }

		/// <summary>
		/// 
	    /// </summary>
		/// <returns></returns>
		public Thread BaseConvertThread { get; set; }

		public ResCollection ConvertAllRes()
		{
			var rescol = new ResCollection();
			var lines = this.DatData.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
			var i = 1;
			foreach (var item in lines)
			{
				if (this.isFunc)
				{
					rescol.Add(this.ConvertFunction.Invoke(item));
				}
				else
				{
					rescol.Add(this.CovertRegexRes(item, i));
					i++;
				}
			}
			throw new NotImplementedException();
		}

		public Res CovertRegexRes(string resLine, int num)
		{
			var m = this.ConvertRegex.Match(resLine);
			var res = new Res(num, m.Groups["name"].Value, m.Groups["mail"].Value, m.Groups["body"].Value, m.Groups["id"].Value, m.Groups["date"].Value, m.Groups["be"].Value, VisibleState.None);
			return res;
		}

		public static Res ConvertRes(string resline, Regex re)
		{
			var m = re.Match(resline);
			var res = new Res(-1, m.Groups["name"].Value, m.Groups["mail"].Value, m.Groups["body"].Value, m.Groups["id"].Value, m.Groups["date"].Value, m.Groups["be"].Value, VisibleState.None);
			return res;
		}

		public static Res ConvertRes(string resn, Func<string, Res> func)
		{
			return func.Invoke(resn);
		}




	}
}
